home *** CD-ROM | disk | FTP | other *** search
- Path: xanth!mcnc!gatech!mandrill!hal!ncoast!allbery
- From: marc@uunet.uu.net@tss.UUCP (Marc Meyer)
- Newsgroups: comp.sources.misc
- Subject: v03i062: program for keeping timed transcript for activity logs
- Keywords: activities time-management status-reporting
- Message-ID: <307@tekbspa.UUCP>
- Date: 24 Jun 88 21:23:49 GMT
- Sender: allbery@ncoast.UUCP
- Reply-To: marc@uunet.uu.net@tss.UUCP (Marc Meyer)
- Organization: Teknekron Software Systems, San Jose, CA.
- Lines: 411
- Approved: allbery@ncoast.UUCP
-
- comp.sources.misc: Volume 3, Issue 62
- Submitted-By: "Marc Meyer" <marc@uunet.uu.net@tss.UUCP>
- Archive-Name: activ
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of shell archive."
- # Contents: README activ.c
- # Wrapped by marc@alcatraz on Fri Jun 24 14:13:08 1988
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'README' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README'\"
- else
- echo shar: Extracting \"'README'\" \(449 characters\)
- sed "s/^X//" >'README' <<'END_OF_FILE'
- X/*
- X** ACTIV -- keep an activity typescript.
- X** whenever the user types, will prepend the time if the typein has been
- X** quiet for more than Interval, which defaults to 20 secs, but may be
- X** overridden with -i flag. If over two hours, pust the entire time and
- X** date out. Copies to a file.
- X**
- X** Useage:
- X** activ [-i interval] file
- X**
- X** Compilation:
- X** make activ -- no Makefile needed
- X**
- X** History:
- X** 6/23/88 -- (marc) documented
- X**
- X*/
- END_OF_FILE
- if test 449 -ne `wc -c <'README'`; then
- echo shar: \"'README'\" unpacked with wrong size!
- fi
- # end of 'README'
- fi
- if test -f 'activ.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'activ.c'\"
- else
- echo shar: Extracting \"'activ.c'\" \(5423 characters\)
- sed "s/^X//" >'activ.c' <<'END_OF_FILE'
- X
- X/*
- X** ACTIV -- keep an activioty typescript.
- X** whenever the user types, will prepend the time if the typein has been
- X** quiet for more than Interval, which defaults to 20 secs, but may be
- X** overridden with -i flag. If over two hours, pust the entire time and
- X** date out. Copies to a file.
- X**
- X** Useage:
- X** activ [-i interval] file
- X**
- X** History:
- X** 6/23/88 -- (marc) documented
- X**
- X*/
- X
- X# include <stdio.h>
- X# include <sgtty.h>
- X# include <signal.h>
- X# include <time.h>
- X# include <errno.h>
- X# include <ctype.h>
- X
- X# define MAXLINE 350
- X
- Xstruct sgttyb Ogttyb;
- Xchar Erasec, Eofc, Killc, Wordc;
- Xchar *Outfile;
- XFILE *Outf;
- X
- Xmain(argc, argv)
- X{
- X args(argc, argv);
- X openFile();
- X setty();
- X setend();
- X dialog();
- X}
- X
- XopenFile()
- X{
- X if (!Outfile)
- X {
- X fprintf(stderr, "usage: activ file\n");
- X exit (-1);
- X }
- X if (!(Outf = fopen(Outfile, "a+")))
- X {
- X perror(Outfile);
- X exit (-1);
- X }
- X setlinebuf(Outfile);
- X}
- Xsetty()
- X{
- X struct sgttyb ngttyb;
- X struct tchars tchars;
- X struct ltchars lchars;
- X
- X /* set cbreak mode */
- X ioctl(0, TIOCGETP, &Ogttyb);
- X ngttyb = Ogttyb;
- X ngttyb.sg_flags |= CBREAK;
- X ngttyb.sg_flags &= ~ECHO;
- X
- X ioctl(0, TIOCSETP, &ngttyb);
- X /* set editting characters */
- X ioctl(0, TIOCGETC, &tchars);
- X Eofc = tchars.t_eofc;
- X ioctl(0, TIOCGLTC, &lchars);
- X Wordc = lchars.t_werasc;
- X
- X Erasec = Ogttyb.sg_erase;
- X Killc = Ogttyb.sg_kill;
- X}
- Xsetend()
- X{
- X int endIt();
- X
- X /* ensure that upon SIGINT, we dump things, and close the
- X * file
- X */
- X signal(SIGINT, endIt);
- X}
- XendIt()
- X{
- X /* close file, reset tty mode to original mode */
- X fclose(Outf);
- X ioctl(0, TIOCSETP, &Ogttyb);
- X exit (0);
- X}
- Xdialog()
- X{
- X for (;;)
- X {
- X await_inp();
- X fill_line();
- X }
- X}
- Xawait_inp()
- X{
- X int fdt;
- X int err;
- X extern errno;
- X
- X for (;;)
- X {
- X fdt = 1 << 0;
- X err = select(32, &fdt, NULL, NULL, NULL);
- X if (err != -1)
- X return;
- X if (errno != EINTR)
- X perror("select");
- X }
- X}
- X
- X# define INTERVAL 20
- X
- Xchar EntireLine[MAXLINE];
- Xint LineBegin;
- Xint OutCol;
- Xint EdittedLine;
- Xint ShownTill = 0;
- Xint FirstCharOnLine = 1;
- Xchar Line[MAXLINE];
- Xlong LastTime;
- Xlong ThisTime;
- Xint Interval = INTERVAL;
- Xint EofIn;
- X
- Xfill_line()
- X{
- X gettime();
- X get_any(Line, sizeof Line);
- X if (gt_interval())
- X FirstCharOnLine = 1;
- X if (FirstCharOnLine)
- X {
- X dumpline();
- X newline();
- X }
- X add_to_line(Line);
- X line_edit(); /* edit and echo. */
- X if (completeline())
- X {
- X dumpline();
- X }
- X if (eof_reached())
- X {
- X endIt();
- X /*NOTREACHED*/
- X }
- X}
- Xgettime()
- X{
- X ThisTime = time(NULL);
- X}
- Xgt_interval()
- X{
- X long t = time(0);
- X
- X return (t - LastTime > Interval);
- X}
- Xdumpline()
- X{
- X int n = strlen(EntireLine);
- X
- X fputs(EntireLine, Outf);
- X if (n != 0 && EntireLine[n-1] != '\n')
- X {
- X putc('\n', stdout);
- X putc('\n', Outf);
- X }
- X EntireLine[0] = 0;
- X EdittedLine = 0;
- X LineBegin = 0;
- X OutCol = 0;
- X fflush(Outf);
- X}
- Xadd_to_line(s)
- Xchar *s;
- X{
- X strcat(EntireLine, s);
- X}
- Xnewline()
- X{
- X struct tm *tm;
- X char data[40];
- X char *timestring;
- X char *ctime();
- X struct tm *localtime();
- X char *s;
- X
- X if (ThisTime - LastTime >= 2 * 60 * 60)
- X {
- X s = ctime(&ThisTime);
- X s[strlen(s) - 1] = 0; /* get rid of final newline */
- X sprintf(data, "[%s] ", s);
- X }
- X else
- X {
- X tm = localtime(&ThisTime);
- X sprintf(data, "[%02d:%02d:%02d] ", tm->tm_hour, tm->tm_min,
- X tm->tm_sec);
- X s = data;
- X }
- X add_to_line(data);
- X LineBegin = strlen(EntireLine);
- X EdittedLine = LineBegin;
- X OutCol = 0;
- X LastTime = ThisTime;
- X fputs(data, stdout);
- X fflush(stdout);
- X}
- Xline_edit()
- X{
- X char *i, *o;
- X
- X for (i = &EntireLine[EdittedLine], o = i;
- X *i; i++)
- X {
- X if (*i == Killc)
- X {
- X o = &EntireLine[LineBegin];
- X EdittedLine = LineBegin;
- X erase_col(OutCol);
- X OutCol = 0;
- X }
- X else if (*i == Erasec)
- X {
- X --o;
- X if (OutCol > 0)
- X {
- X OutCol--;
- X EdittedLine--;
- X erase_col(1);
- X }
- X } else if (*i == Wordc)
- X {
- X if (OutCol <= 0)
- X continue;
- X /* skip initial spaces */
- X if (isspace(o[-1]))
- X {
- X while (OutCol > 0 && isspace(*--o))
- X {
- X OutCol--;
- X EdittedLine--;
- X erase_col(1);
- X }
- X if (OutCol != 0)
- X o++;
- X }
- X /* skip word */
- X while (OutCol > 0 && !isspace(*--o))
- X {
- X OutCol--;
- X EdittedLine--;
- X erase_col(1);
- X }
- X if (OutCol != 0)
- X o++;
- X }
- X else if (*i == Eofc)
- X {
- X EofIn++;
- X break;
- X }
- X else if (isgraph(*i) || isspace(*i))
- X {
- X *o++ = *i;
- X EdittedLine++;
- X OutCol++;
- X if (*i == '\n')
- X {
- X *i = 0;
- X *--o = 0;
- X dumpline();
- X /* continue till end */
- X line_edit();
- X }
- X else
- X putchar(*i);
- X }
- X else
- X {
- X /* can't map the file output because doing it in place,
- X * but can map the tty output, though i'll be confused
- X * backspaceing!
- X */
- X EdittedLine += 1;
- X OutCol += 2;
- X putchar('^');
- X putchar(*i | 0100);
- X *o++ = *i;
- X }
- X }
- X *o = 0;
- X fflush(stdout);
- X LastTime = ThisTime;
- X FirstCharOnLine = 0;
- X}
- Xcompleteline()
- X{
- X return (EntireLine[strlen(EntireLine) - 1] == '\n');
- X}
- Xeof_reached()
- X{
- X return (EofIn);
- X}
- Xerase_col(i)
- X{
- X while (--i >= 0)
- X fputs("\b \b", stdout);
- X fflush(stdout);
- X}
- Xget_any(buf, size)
- Xchar *buf;
- Xint size;
- X{
- X int n;
- X
- X n = read(0, buf, size);
- X if (n > 0)
- X buf[n] = 0;
- X}
- Xargs(argc, argv)
- Xint argc;
- Xchar **argv;
- X{
- X int i;
- X
- X for (argv++; *argv; argv++)
- X {
- X if (**argv != '-')
- X Outfile = *argv;
- X else switch ((*argv)[1])
- X {
- X case 'i': /* set interval */
- X if (!argv[1])
- X break;
- X i = atoi(*++argv);
- X if (i > 0)
- X Interval = i;
- X break;
- X
- X case '?':
- X fprintf(stderr, "usage: activ [-i interval] file\n");
- X break;
- X
- X default:
- X fprintf(stderr, "activ: unknown flag `%s'\n",
- X *argv);
- X }
- X }
- X}
- END_OF_FILE
- if test 5423 -ne `wc -c <'activ.c'`; then
- echo shar: \"'activ.c'\" unpacked with wrong size!
- fi
- # end of 'activ.c'
- fi
- echo shar: End of shell archive.
- exit 0
-